package com.tedu.api.map;

import org.junit.Test;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;

/**java.util
 * Map与Collection同等级的顶级接口
 * Map映射接口
 * 作用:一个元素由两个对象构成,分别为Key(键)和Value(值)构成
 *        获取数据:采用键取值,通常与数据搭配,获取字段下的值
 * 特点:无序、无下标、键不可以重复【唯一性】、值可以重复
 *
 *
 * Map接口---实例化【创建】对象---
 * Hashmap哈希卖破[超🐓常用]:由哈希算法底层实现，存储性能快，键可以存null，但只允许一个
 *                        主要是通过键找值
 * LinkedHashMap[不常用]:
 * TreeMap[old不用，你气不气]:
 * Hashtable[old不用]:
 * ConcurrentHashMap[较为常用]映射集合接口:跟线程在一块用，学习多线程
 *
 * 重点:Map接口中方法【Map接口方法与HashMap方法类似  90%】
 *
 */
public class MapAPI {
    @Test
    public void testMap() {
        //创建Map映射接口---多态
        Map<Object/*键*/, String/*值*/> map = new HashMap<>();
        //键--->值  添加元素:  K-V
        /**
         * put("键","值")  返回值:V  value 值
         * 作用：存键值对形态一组数据
         */
        map.put("祖安怒兽", "沃里克");//存一个键和一个值
        map.put("时间刺客", "艾克");
        map.put("祖安花火", "泽丽");
        map.put("暴走萝莉", "金克丝");
        System.out.println("祖安map映射存储数据：" + map);
        /**
         * get(E e) 根据键来找到对应的值  返回值:V value
         * remove(K Key) 通过Key删除一组数值对
         * size()
         */
        //找到map集合中 金克丝的值
        String jinkesi = map.get("暴走萝莉");//前缀String去找
        System.out.println("爆爆是：" + jinkesi);
        //get()  键不存在则返回默认值:基本类型、引用类型:null值
        String wolike = map.get("祖安怒兽");
        System.out.println("狼人是：" + wolike);
        map.remove("祖安花火");
        System.out.println(map);
        /**
         * containsKey()      返回值：boolean
         * 作用：判断map中元素  ”对象：键“  是否存在
         * containsValue()    返回值：boolean
         * 作用：判断map中元素  ”对象：值“  是否存在
         */
        boolean bk = map.containsKey("红楼梦");
        System.out.println("" + bk);
        boolean bv = map.containsValue("武松");
        System.out.println("" + bv);
    }
/**
 * map 元素遍历    键:实际上是Set集合：唯一性-->值
 * keySet()   获取map元素中所有的键
 * values()   获取map元素中所有的值
 * entrySet()  获取map元素中所有的键与值
 */
        @Test
        public void testKVE () {
            //创建map映射集合
            Map<Object, String> map = new HashMap<>();
            map.put("默", "那英");
            map.put("告别气球", "周杰伦");
            map.put("套马杆", "乌拉图雅");
            map.put("丑八怪", "薛之谦");
            //1.获取map集合元素中  键 数据  keySet()  返回值：Set集合
            Set<Object> sets = map.keySet();
            //1.2遍历从map元素中获取的键--数据
            for (Object keys : sets) {
                System.out.println("输出map元素中：" + keys);
            }
            //2.获取map集合元素中  值 数据  values()  返回值：Collection
            Collection<String> cs = map.values();
            //2.2遍历从map元素中获取的键--数据
            for (String values : cs) {
                System.out.println("输出map元素中：" + values);
            }
            //3.获取map集合元素【entrys】中 数据：键与值  entrySet()
            //返回值：Set<Map.Entry<K,V>>
            //Map.Entry<K,V> 保存Map元素一组数据，表示:一组entry
            Set<Map.Entry<Object, String>> entrys = map.entrySet();
            //获取map映射集合所有元素【entry】
            //3.1遍历map所有的键与值【所有entry/元素/数据--成对】
            for (Map.Entry<Object, String> entry : entrys) {
                //3.2获取键  getKey   注意：类型
                Object keys = entry.getKey();
                //3.3获取值  getValue 注意：类型
                String values = entry.getValue();
                //3.4打印
                System.out.println(keys + " " + values);
            }
        }

        /**
         * forEach(new BiConsumer()) 遍历map中所有 对元素/entry
         * 理解：for+entrySet()集合=forEach
         * BiConsumer接口参数  传入
         * 理解：针对map存储问题--封装接口--提供方法：accept()一组entry
         */
        @Test
        public void testForEach() {
            //创建map映射集合
            Map<Object, String> map = new HashMap<>();
            map.put("默", "那英");
            map.put("告别气球", "周杰伦");
            map.put("套马杆", "乌拉图雅");
            map.put("丑八怪", "薛之谦");
            //map映射集合---提供一套方法：forEach()
            map.forEach(new BiConsumer<Object, String>() {
                //accept() 方法：获取到Entry中--每组entry
                public void accept(Object key, String value) {
                    System.out.println(key + " " + value);
                }
            });
        }

        /**
         * HashMap 映射集合
         * HashMap中方法基本与Map方法一致
         * putIfAbsent()
         * 作用：用来给HashMap映射集合存入【Entry/一组数据：一组键值】
         * 如果存入一组数据，不存在的键，插入HashMap
         * 存在的键，不插入HashMap
         * 哈希算法--唯一性
         */
        @Test
        public void testHashMap() {
            //创建map映射集合
            Map<Object, String> map = new HashMap<>();
            map.putIfAbsent("演员","薛之谦");
            map.put("默", "那英");map.put("告别气球", "周杰伦");
            map.put("套马杆", "乌拉图雅");map.put("丑八怪", "薛之谦");

            System.out.println("HashMap存值"+map);

        }
    }